// 1.包含头文件
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/float32.hpp"
#include "std_msgs/msg/int32.hpp"

using namespace std::chrono_literals;

// 3.自定义节点类；
class Arm_Talker : public rclcpp::Node
{
public:
    Arm_Talker() : Node("arm_talker_node_cpp")
    {
        // 位置发布
        pos_pub_ = this->create_publisher<std_msgs::msg::Float32>("pos_true", 10);
        // 定时器
        timer_ = this->create_wall_timer(0.1s, std::bind(&Arm_Talker::on_timer, this));
    }

private:
    // 定义速度发布方
    rclcpp::Publisher<std_msgs::msg::Float32>::SharedPtr pos_pub_;
    // 定义计时器
    rclcpp::TimerBase::SharedPtr timer_;
    // 定义回调函数
    void on_timer()
    {
        float input_pos;
        while (!(std::cin >> input_pos))
        {                                                                       // 检查输入是否成功
            std::cin.clear();                                                   // 清除错误标志
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 忽略错误输入直到下一个换行符
        }
        auto input_pos_data = std_msgs::msg::Float32();
        input_pos_data.data = input_pos;
        // 发布数据
        pos_pub_->publish(input_pos_data);
    }
};

int main(int argc, char const *argv[])
{
    // 2.初始化ROS2客户端；
    rclcpp::init(argc, argv);
    // 4.调用spain函数，并传入节点对象指针；
    rclcpp::spin(std::make_shared<Arm_Talker>());
    // 5.资源释放
    rclcpp::shutdown();
    return 0;
}